// Copyright (c) 2010 Johann Duscher (alias Jonny Dee)
//
// Permission is hereby granted, free of charge, to any person
// obtaining a copy of this software and associated documentation
// files (the "Software"), to deal in the Software without
// restriction, including without limitation the rights to use,
// copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following
// conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
// OTHER DEALINGS IN THE SOFTWARE.


#ifndef HOST_H
#define HOST_H

#include <vector>
#include <enet/enet.h>

namespace enetpp
{

    class Address;
    class ENet;
    class Event;
    class Packet;
    class Peer;

    class Host
    {
        friend class ENet;

        ENet* _parent;
        ENetHost* _host;
        std::vector< ENetPeer* > _allPeers;

        Host(ENet* parent, const Address& address, size_t maxClients, enet_uint32 incomingBandwidth, enet_uint32 outgoingBandwidth);
        Host(ENet* parent, size_t maxClients, enet_uint32 incomingBandwidth, enet_uint32 outgoingBandwidth);
    public:
        ~Host();

        void destroy();
        int service(Event& event, enet_uint32 timeoutMillis = 0);
        Peer connect(const Address& address, size_t channelCount);
        void broadcast(enet_uint8 channelID, Packet& packet);
        void flush();
        void bandwidthThrottle();
        void bandwidthLimit(enet_uint32 incomingBandwidth, enet_uint32 outgoingBandwidth);
        int checkEvents(Event& event) const;
    protected:
        void handleEvent(Event& event);
    };
}

#endif // HOST_H
